package org.dalmatian.common.satoken.config;

import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.solon.integration.SaTokenInterceptor;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.dalmatian.common.core.constants.HttpStatus;
import org.dalmatian.common.satoken.core.interceptor.SaTokenExceptionInterceptor;
import org.noear.solon.annotation.Condition;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Bean;
import org.dalmatian.common.satoken.core.dao.PlusSaTokenDao;
import org.dalmatian.common.satoken.core.service.SaPermissionImpl;


/**
 * Sa-Token 配置
 *
 * @author Lion Li
 */
@Configuration
public class SaTokenConfiguration {

    @Bean(index = -100)  //-100，是顺序位（低值优先）
    public SaTokenInterceptor saTokenInterceptor() {
        return new SaTokenInterceptor()
            // 指定 [拦截路由] 与 [放行路由]
            .addInclude("/**").addExclude("/favicon.ico")
            // 认证函数: 每次请求执行
            .setAuth(req -> {
                // System.out.println("---------- sa全局认证");
                SaRouter.match("/**", StpUtil::checkLogin);
            })
            // 异常处理函数：每次认证函数发生异常时执行此函数 //包括注解异常
            .setError(e -> {
                if (e instanceof NotLoginException) {
                    return SaResult.error(e.getMessage()).setCode(HttpStatus.UNAUTHORIZED);
                }
                return SaResult.error("认证失败，无法访问系统资源").setCode(HttpStatus.UNAUTHORIZED);
            });
    }

    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForSimple();
    }

    /**
     * 权限接口实现(使用bean注入方便用户替换)
     */
    @Bean
    public StpInterface stpInterface() {
        return new SaPermissionImpl();
    }

    /**
     * 自定义dao层存储
     */
    @Bean
    @Condition(onProperty = "${tenant.enable} == false")
    public SaTokenDao saTokenDao() {
        return new PlusSaTokenDao();
    }

    /**
     * 异常处理器
     */
    @Bean
    public SaTokenExceptionInterceptor saTokenExceptionInterceptor() {
        return new SaTokenExceptionInterceptor();
    }

}
